import { Router } from 'vue-router';
import { useStorage } from '@vueuse/core';
import { storeToRefs } from 'pinia';
import { useAuthStore } from '@/stores/auth';

const token = useStorage<string | undefined>('token', '');

// 判断路由是否存在于store.auth.routes，保持与服务器同步
const findPathInRoutes = (
  path: string,
  routes: API.auth.RouteSchema[] = []
): boolean => {
  let flag = false;
  for (const i in routes) {
    const item = routes[i];
    // 判断路径是否相同
    if (item.route == path) {
      flag = true;
      break;
    }
    // 如果路径不相同，则判断是否有下级
    else if (item.children && item.children.length) {
      // 如果有下级，进行递归判断
      flag = findPathInRoutes(path, item.children);
      // 判断下级是否有相同路径
      if (flag) break;
    }
  }
  return flag;
};

/**
 * 路由守卫
 *
 * @param router
 *
 * @todo 判断前往的路由是否在白名单中
 * @todo 判断token是否存在
 */
const Guard = (router: Router) => {
  router.beforeEach(async (to, _from, next) => {
    const authStore = useAuthStore();
    const { requestProfile, requestRoutes } = authStore;
    const { routes, profile } = storeToRefs(authStore);

    // 权重1，白名单判断
    if (to.meta.white === true) {
      console.log('route white');
      return next();
    }

    // 权重2，判断token
    if (!token.value) {
      console.log('route not token');
      // 前往登录页
      return next('/login');
    }

    // 判断有无菜单及权限
    if (!routes.value) {
      await requestRoutes();
    }

    // 判断有无用户信息
    if (!profile.value) {
      await requestProfile();
    }

    // 判断是否基础页面，权重3
    if (to.meta.base === true) {
      return next();
    }

    // 由于导航是通过API获取，此处需要增加延时策略
    // 权重4，判断是否存在API路由中
    if (!findPathInRoutes(to.path, routes.value)) {
      // 页面不允许访问，跳404页面
      token.value = null;
      return next('/404');
    } else {
      return next();
    }
  });
};

export default Guard;
